package com.health_predict_springboot.utils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;

/**
 * 日期工具类，提供日期格式化、解析、计算等功能
 */
public class DateUtils {

    // 默认日期格式
    public static final String DEFAULT_FORMAT = "yyyy-MM-dd HH:mm:ss";
    public static final String DATE_FORMAT = "yyyy-MM-dd";
    public static final String TIME_FORMAT = "HH:mm:ss";

    /**
     * 将日期转换为字符串
     * @param date 日期对象
     * @param format 日期格式
     * @return 格式化后的日期字符串
     */
    public static String formatDate(Date date, String format) {
        if (date == null) {
            return null;
        }
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        return sdf.format(date);
    }

    /**
     * 将日期转换为默认格式的字符串（yyyy-MM-dd HH:mm:ss）
     * @param date 日期对象
     * @return 默认格式的日期字符串
     */
    public static String formatDate(Date date) {
        return formatDate(date, DEFAULT_FORMAT);
    }

    /**
     * 将字符串解析为日期
     * @param dateStr 日期字符串
     * @param format 日期格式
     * @return 解析后的日期对象
     * @throws ParseException 解析异常
     */
    public static Date parseDate(String dateStr, String format) throws ParseException {
        if (dateStr == null || dateStr.trim().isEmpty()) {
            return null;
        }
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        return sdf.parse(dateStr);
    }

    /**
     * 将字符串解析为日期（使用默认格式yyyy-MM-dd HH:mm:ss）
     * @param dateStr 日期字符串
     * @return 解析后的日期对象
     * @throws ParseException 解析异常
     */
    public static Date parseDate(String dateStr) throws ParseException {
        return parseDate(dateStr, DEFAULT_FORMAT);
    }

    /**
     * 获取当前日期
     * @return 当前日期对象
     */
    public static Date getCurrentDate() {
        return new Date();
    }

    /**
     * 获取当前日期的字符串表示
     * @param format 日期格式
     * @return 当前日期的字符串表示
     */
    public static String getCurrentDateStr(String format) {
        return formatDate(new Date(), format);
    }

    /**
     * 获取当前日期的默认格式字符串（yyyy-MM-dd HH:mm:ss）
     * @return 当前日期的默认格式字符串
     */
    public static String getCurrentDateStr() {
        return formatDate(new Date());
    }

    /**
     * 计算日期之间的天数差
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 天数差
     */
    public static long getDaysBetween(Date startDate, Date endDate) {
        if (startDate == null || endDate == null) {
            return 0;
        }
        long diff = endDate.getTime() - startDate.getTime();
        return diff / (1000 * 60 * 60 * 24);
    }

    /**
     * 在日期上增加指定的天数
     * @param date 原始日期
     * @param days 要增加的天数
     * @return 增加天数后的日期
     */
    public static Date addDays(Date date, int days) {
        if (date == null) {
            return null;
        }
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.add(Calendar.DAY_OF_MONTH, days);
        return calendar.getTime();
    }

    /**
     * 在日期上增加指定的月数
     * @param date 原始日期
     * @param months 要增加的月数
     * @return 增加月数后的日期
     */
    public static Date addMonths(Date date, int months) {
        if (date == null) {
            return null;
        }
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.add(Calendar.MONTH, months);
        return calendar.getTime();
    }

    /**
     * 在日期上增加指定的年数
     * @param date 原始日期
     * @param years 要增加的年数
     * @return 增加年数后的日期
     */
    public static Date addYears(Date date, int years) {
        if (date == null) {
            return null;
        }
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.add(Calendar.YEAR, years);
        return calendar.getTime();
    }

    /**
     * 获取日期的年份
     * @param date 日期对象
     * @return 年份
     */
    public static int getYear(Date date) {
        if (date == null) {
            return 0;
        }
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        return calendar.get(Calendar.YEAR);
    }

    /**
     * 获取日期的月份（从0开始）
     * @param date 日期对象
     * @return 月份（0-11）
     */
    public static int getMonth(Date date) {
        if (date == null) {
            return 0;
        }
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        return calendar.get(Calendar.MONTH);
    }

    /**
     * 获取日期的日
     * @param date 日期对象
     * @return 日（1-31）
     */
    public static int getDay(Date date) {
        if (date == null) {
            return 0;
        }
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        return calendar.get(Calendar.DAY_OF_MONTH);
    }

    /**
     * 判断两个日期是否是同一天
     * @param date1 第一个日期
     * @param date2 第二个日期
     * @return 是否是同一天
     */
    public static boolean isSameDay(Date date1, Date date2) {
        if (date1 == null || date2 == null) {
            return false;
        }
        Calendar cal1 = Calendar.getInstance();
        Calendar cal2 = Calendar.getInstance();
        cal1.setTime(date1);
        cal2.setTime(date2);
        return cal1.get(Calendar.YEAR) == cal2.get(Calendar.YEAR) &&
               cal1.get(Calendar.MONTH) == cal2.get(Calendar.MONTH) &&
               cal1.get(Calendar.DAY_OF_MONTH) == cal2.get(Calendar.DAY_OF_MONTH);
    }

    /**
     * 获取日期所在月份的第一天
     * @param date 日期对象
     * @return 该月的第一天
     */
    public static Date getFirstDayOfMonth(Date date) {
        if (date == null) {
            return null;
        }
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.set(Calendar.DAY_OF_MONTH, 1);
        calendar.set(Calendar.HOUR_OF_DAY, 0);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
        calendar.set(Calendar.MILLISECOND, 0);
        return calendar.getTime();
    }

    /**
     * 获取日期所在月份的最后一天
     * @param date 日期对象
     * @return 该月的最后一天
     */
    public static Date getLastDayOfMonth(Date date) {
        if (date == null) {
            return null;
        }
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
        calendar.set(Calendar.HOUR_OF_DAY, 23);
        calendar.set(Calendar.MINUTE, 59);
        calendar.set(Calendar.SECOND, 59);
        calendar.set(Calendar.MILLISECOND, 999);
        return calendar.getTime();
    }
}